package com.itheima;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@SpringBootApplication
@ServletComponentScan
public class TliasWebManagementApplication {

    public static void main(String[] args) {
        SpringApplication.run(TliasWebManagementApplication.class, args);
    }

//1.Mybatis默认数据封装的规则?
//实体类属性名 和 数据库表的字段名一致，mybatis会自动封装
// 2.如果字段名与实体类属性名不一致，如何解决?
// 手动结果映射 @Results、@Result
//起别名
//开启驼峰命名开关(要求:xxx abcxxxAbc


//    1.什么是反向代理?
//反向代理是一种网络架构技术，通过反向代理服务器为后端服务器做代理(安全灵活、负载均衡)
//2.Nginx中反向代理的配置?
//^~ /api/ {locationi //定义路径匹配方式
//^/api/(.*)$ /$1 break;rewrite //路径重写指令
//http://localhost:8080;proxy passA //代理转发指令

//1.如何接收JSON格式的请求参数?通常通过实体对象接收，保证json格式的键名与对象属性名保持一致，并添加@RequestBody注解
//2.json格式的请求参数适用场景?
//主要在POST、PUT请求中，在请求体传递请求参数

//    1.如何接收路径参数 ?
//●@PathVariable 注解来声明获取的是路径参数
// 2.在url中是否可以携带多个路径参数呢，如:/depts/1/0
//●可以，接收方式如下
//@GetMapping("/depts/{id}/{sta}")
//public Result getInfo(aPathVariable Integer id, aPathVariable Integer sta){
////...

//    1.RequestMapping 注解可以加在哪儿?
//类上(可选的)
//方法上
//一个完整的请求路径=类上+方法上的

//    1.Logback日志级别有哪些，依次从低到高?
//trace, debug,info,warn,error2.常用的有哪些?具体的使用场景?
//debug:记录程序的调试信息
//info:记录正常系统运行日志，重要信息error:记录错误异常信息

//    1.queryString查询参数接收方式/emps?name=xxx&gender=xxx
//    如果参数较少，controller方法中定义一个一个形参接
//    收如果参数较多，controller方法中定义一个对象接收

//    1.Mybatis中动态SQL的使用场景?
//如果SQL语句是不固定的，是随着用户的输入或外部条件的变化而变化的
// 2.MyBatis中动态SQL的<if>及<where>标签的作用?
// <if>标签:条件判断，如果条件成立，则拼接对应的sql片段
// <where>:根据查询条件，来生成where关键字，并会自动去除条件前面多余的and或or。

//    1.在插入数据之后，如何获取到主键值?
//@Options(useGeneratedKeys=true,keyProperty="id")2.<foreach>动态SQL标签的作用?其中属性的含义?
//●作用:遍历集合/数组
//属性:
//collection:集合名称
//item:集合遍历出来的元素/项
//separator:每一次遍历使用的分隔符(可选)
//open:遍历开始前拼接的片段(可选)
//close:遍历结束后拼接的片段(可选)

//    1.什么是事务 ?
//事务是一组操作的集合，是一个不可分割的工作单位。这组操作要么全部成功，要么全部失败。
//2.如何控制事务?
//开启事务:start transaction/begin;
//提交事务:commit;(全部成功)
//回滚事务:rollback;(只要有一项失败)3.场景 ?
//银行转账;
//下单扣减库存;

//    1.Spring事务管理的注解@Transactional的作用是什么，可以加在什么位置?
//    会在方法运行之前，开启事务，运行完毕后，根据运行的结果GTransactional:来提交或回滚事务
//    位置:方法女、类上、接口上

//    1.事务的传播行为控制的是什么 ?
//，一个事务方法,调用另外一个事务方法时,事务应该如何控制(加入?新建?...)2.常见的传播行为及应用场景 ?
//REQUIRED:大部分场景
//REQUIRES NEW:希望两个方法在独立的事务中运行，互不影响

//    1.如何将上传的文件存储在服务器本地?
//multipartFile.getOriginalFilename():获取原始文件名multipartFile.transferTo(File dest):将文件转存到磁盘文件2.上传文件大小受限怎么办?
//默认上传文件的最大大小为1MB，超过大小需要在配置文件配置
//application.yml
//spring:
//servlet:
//multipart:
//max-file-size:10MB#最大单个文件大小
// max-request-size:100MB#最大请求总大小(包括所有文件和表单数据)

//    1.注入外部配置文件中的配置项的两种方式?
//@Value:一个属性一个属性的注入
//@ConfigurationProperties:批量将多个属性注入到bean对象中
//2.两种方式各自的使用场景?
//如果属性较少，建议@Value注入即可
//如果属性较多,考虑复用,建议使用@ConfigurationProperties

//    1.在封装查询结果，什么时候用结果类型，什么时候用结果地图?
//如果查询返回的字段名与实体的属性名可以直接对应上，用结果类型。
//如果查询返回的字段名与实体的属性名对应不上，或实体属性比较复杂可以通过结果图手动封装。

//    1.如何定义一个全局异常处理器?
//    @RestControllerAdvice =ControllerAdvice +@ResponseBody
//    @ExceptionHandler

//    1.case流程控制函数
//语法一:
//case when cond l then res1[when cond2 then res2 else resend
//语法二(适用于等值匹配):
//case expr when val1then res l [when val2 then res2 else res end

//    1.if流程控制函数
//if(expr,val1,val2):如果表达式expr成立，取val1，否则取val2ifnull(expr,val1):如果expr不为null，取自身，否则取val1

//    1.Cookie会话跟踪方案的原理?
//响应头:Set-Cookie
//请求头:Cookie
//2.Cookie会话跟踪方案的优缺点?优点:HTTP协议中支持的技术
//缺点:
//移动端APP无法使用Cookie
//不安全，用户可以自己禁用Cookie
//Cookie不能跨域

//    1.Session会话跟踪方案的原理?
//Session的底层是基于Cookie的(Set-Cookie,Cookie)
//2.Session会话跟踪方案的优缺点?
//优点:存储在服务端，安全
//缺点:
//服务器集群环境下无法直接使用Session
//Cookie的缺点

//    1.令牌会话跟踪方案的优缺点 ?
//优点:
//支持PC端、移动端
//解决集群环境下的认证问题
//减轻服务器端存储压力

//    1.JWT令牌由哪几个部分组成，每个部分都存储什么内容?
//header(头)，记录令牌类型、签名算法
//payload(载荷)，携带一些自定义的信息
//signature(签名)，访问被篡改，保证安全性
//2.JWT令牌生成及校验?
//eJwts.builder()..
//Jwts.parser()...
//3.JWT令牌解析(校验)时什么情况会报错?
//JWT令牌被篡改 或 过期失效了
//注意事项4.
//JWT校验时使用的签名秘钥，必须和生成JWT令牌时使用的秘钥是配套的

//    1.Filter的开发步骤 ?
//定义:定义一个类实现Filter接口(init、doFilter、destroy)
//配置:
//@WebFilter(urlPatterns="/*")》
//@ServletComponentScan
//注意事项
//如果过滤器中不执行放行操作，过滤器拦截到请求之后，就不会访问对应的资源。
//放行:chain.doFilter(request,response

    //校验的流程
//    1.获取请求url。
//2.判断请求url中是否包含login，如果包含，说明是登录操作，放行3.获取请求头中的令牌(token)
//4.判断令牌是否存在，如果不存在，响应401。
//5.解析token，如果解析失败，响应401。
//6.放行。

//    1.过滤器的执行流程
//放行前 ->放行 ->资源 ->放行后
//2.配置的过滤器的拦截路径/*与 /emps/* 分别代表什么意思 ?
//●/*:表示拦截所有
///emps/*:表示目录拦截，拦截/emps下的所有资源
//3.什么是过滤器链 ?
//项目中的多个过滤器就形成了一个过滤器链


//    1.拦截器Interceptor的使用步骤?
//定义:实现HandlerInterceptor接口
//1.preHandle
//2.postHandle
//3.afterCompletion
//配置:定义一个配置类实现WebMvcConfigurer接口，注册拦截器(/**)

//    1.拦截器中的拦截路径/*与/**的区别是什么 ?
//●/*:只能拦截一级路径，如:/depts，/emps
//●/**:拦截任意级路径，如:/depts，/depts/1
//2.过滤器与拦截器的区别 ?
//接口规范不同
//拦截范围不同

//    1，什么是ThreadLocal
//ThreadLocal其实是线程的局部变量，为每个线程提供单独一份存储空间，具有线程隔离的效果，不同的线程之间不会相互干扰
//ThreadLocal的应用场景
//在同一个线程/同一个请求中，进行数据共享。

//    面试题1:Spring容器的bean是单例的还是多例的?单例的bean是什么时候实例化的?
//默认是单例的
//单例的bean，默认是项目启动时实例化的(通过@Lazy可以延迟初始化)
//面试题2:Spring容器的bean是线程安全的吗?
//bean的线程安全取决于bean的状态及bean的作用域
//单例bean:如果是无状态的bean，内部不保存任何状态信息，则是线程安全的
//单例bean:如果是有状态的bean，内部会保存状态信息，多个线程会同时操作该bean时，可能会出现数据不一致的问题，这样的bean则是线程不安全的。

//    1.什么时候使用@Component声明bean，什么时候使用@Bean注解?
//一般如果是项目中自定义的类，使用@Component及其衍生注解
//如果是引入第三方依赖中的类，使用@Bean注解


//    1.为什么第三方依赖中使用@Component及其衍生注解声明bean不生效?基于@Component及其衍生注解声明的bean要想生效，,需要被组件扫描注解扫描到
//2.有哪些方案可以使其生效呢?
//a.通过@ComponentScan注解扫描指定的包
//通过@Import注解将其导入到I0C容器中(四种常见方式)普通类、配置类、ImportSelector实现类、EnableXxx


//    1.@Conditional 及其衍生注解的作用是什么 ?
//满足给定条件后，注册对应的bean对象到SpringI0C容器中。
//2.@Conditional及其衍生注解可以作用在什么地方?
//方法上:针对于当前这个方法声明的bean
//类上:针对于这个类中所有的方法声明的bean
//3.自己定义自动配置类的核心是什么?如何完成自动配置?
//定义自动配置类
//将自动配置类配置在 META-INF/spring/
//org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中

//1.<dependencyManagement>与<dependencies>的区别是什么?
// <dependencies>是直接依赖,在父工程配置了依赖,子工程会直接继承下来。
// <dependencyManagement>是统一管理依赖版本，不会直接依赖，还需要在子工程中引入所需依赖(无需指定版本)

//    1.maven中如何实现聚合关系?
//<modules>...</modules>
//2.maven中继承与聚合的联系与区别?
//联系:继承与聚合都属于设计型模块，打包方式都为pom，常将两种关系制作到同一个pom文件中
//区别:
//1.继承用于简化依赖配置、统一管理依赖版本，是在子工程中配置继承关系
//2.聚合用于快速构建项目是在父工程(聚合工程)中配置聚合的模块

//    1.Maven私服的作用是什么?
//解决团队内部的资源共享与资源同步问题
// 2.有了私服之后依赖查找的顺序是什么样的?本地仓库-->私服 -->中央仓库
}
